package com.zhouxiaoxuan13.promotionservice.repository;

import com.zhouxiaoxuan13.promotionservice.entity.FreshProduct;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

@Repository
public interface FreshProductRepository extends JpaRepository<FreshProduct, Long> {
    
    // 根据名称查找商品
    Optional<FreshProduct> findByName(String name);
    
    // 根据名称模糊查找商品
    List<FreshProduct> findByNameContainingIgnoreCase(String name);
    
    // 根据种类查找商品
    List<FreshProduct> findByCategory(String category);
    
    // 查找所有在促销中的商品
    List<FreshProduct> findByIsOnPromotionTrue();
    
    // 查找库存低于指定数量的商品
    List<FreshProduct> findByStockQuantityLessThan(Integer threshold);
    
    // 根据促销ID查找商品
    List<FreshProduct> findByPromotionId(Long promotionId);
    
    // 更新商品的促销信息
    @Modifying
    @Query("UPDATE FreshProduct f SET f.promotionPrice = :promotionPrice, f.isOnPromotion = :isOnPromotion, f.promotionId = :promotionId WHERE f.name = :productName")
    int updatePromotionInfoByName(@Param("productName") String productName, 
                                  @Param("promotionPrice") BigDecimal promotionPrice, 
                                  @Param("isOnPromotion") Boolean isOnPromotion,
                                  @Param("promotionId") Long promotionId);
    
    // 清除商品的促销信息
    @Modifying
    @Query("UPDATE FreshProduct f SET f.promotionPrice = null, f.isOnPromotion = false, f.promotionId = null WHERE f.promotionId = :promotionId")
    int clearPromotionInfoByPromotionId(@Param("promotionId") Long promotionId);
    
    // 根据名称部分匹配查找商品（用于促销匹配）
    @Query("SELECT f FROM FreshProduct f WHERE f.name LIKE CONCAT('%', :keyword, '%') OR :keyword LIKE CONCAT('%', f.name, '%')")
    List<FreshProduct> findByNameMatching(@Param("keyword") String keyword);
}
